package com.ztr.conversion.word2img;

import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;
import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.List;

/**
 * <p>
 * Word 转 PNG 工具类
 * </p>
 */
@Slf4j
public class Word2PngUtil {


    /**
     * 将Word文档的字节流转换为PNG图片的字节流列表。
     * 此方法通过Aspose Words库将Word文档的每一页转换为PNG图片格式。
     *
     * @param wordBytes Word文档的字节流。
     * @return 包含每一页Word文档转换后的PNG图片字节流的列表。
     * @throws Exception 如果转换过程中发生错误。
     */
    @SneakyThrows(Exception.class)
    public static List<byte[]> wordBytes2PngBytes(byte[] wordBytes) {
        // 初始化Aspose Words的文档对象，传入Word文档的字节流。
        Document doc = new Document(new ByteArrayInputStream(wordBytes));

        // 创建图像保存选项，指定保存格式为PNG。
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.PNG);

        // 设置图像的分辨率。
        iso.setResolution(128);

        // 设置输出图像的格式是否美观。
        iso.setPrettyFormat(true);

        // 设置是否使用抗锯齿技术。
        iso.setUseAntiAliasing(true);

        // 初始化存储转换后PNG图片字节流的列表。
        List<byte[]> pngList = Lists.newArrayList();

        // 遍历文档的每一页，将每一页转换为PNG图片格式。
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 设置当前要转换的页码。
            iso.setPageIndex(i);

            // 初始化用于存储转换后图片字节流的输出流。
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            // 将当前页保存到输出流中，格式为PNG。
            doc.save(outputStream, iso);

            // 将转换后的图片字节流添加到列表中。
            pngList.add(outputStream.toByteArray());
        }

        // 返回包含所有转换后PNG图片字节流的列表。
        return pngList;
    }


    /**
     * 将Word文档的字节流转换为PNG图片文件列表。
     * 该方法通过解析Word文档的字节流，将每一页转换为一个PNG图片文件，存储在指定的根路径下。
     *
     * @param wordBytes   Word文档的字节流。
     * @param imgRootPath 图片文件存储的根路径。
     * @return 包含所有转换后的PNG图片文件的列表。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static List<File> wordBytes2PngFileList(byte[] wordBytes, String imgRootPath) {
        // 初始化文档对象，使用传入的Word字节流。
        Document doc = new Document(new ByteArrayInputStream(wordBytes));
        // 初始化图片保存选项，指定保存格式为PNG。
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.PNG);
        // 设置图片分辨率。
        iso.setResolution(128);
        // 设置输出图片的格式是否美观。
        iso.setPrettyFormat(true);
        // 设置是否使用抗锯齿技术。
        iso.setUseAntiAliasing(true);

        // 初始化存储转换后图片文件路径的列表。
        List<File> pngList = Lists.newArrayList();
        // 遍历文档的每一页，进行转换。
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 构建当前页图片文件的路径。
            String imgPath = imgRootPath + "/" + (i + 1) + ".png";
            // 设置当前页码。
            iso.setPageIndex(i);
            // 将当前页保存到指定路径。
            doc.save(imgPath, iso);
            // 将文件路径添加到列表中。
            pngList.add(new File(imgPath));
        }

        // 返回转换后的图片文件列表。
        return pngList;
    }


}
